/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
/*
 * vd_unsignedint.h
 *
 *		Created on: 22/05/2010
 *    Author: Jesús Martínez Pérez
 */
#ifndef _VDI_H_
#define _VDI_H_
#define MAX 10
#include <iostream> 
using namespace std;
/**
 * \class VD_unsignedint
 *
 *
 * \brief Esta clase hace posible el uso de un vector dinamico de unsigned int
 *         
 *
 * \author Jesús Martínez Pérez 
 *
 *
 * \date $Date: 22/05/2010 $
 *
 */
class VD_unsignedint{
	private:
		int r;
		int n;
		unsigned int *v;
		void Ampliar();
	public:
/**
	@brief Constructor por defecto
*/
		VD_unsignedint();
/**
@brief Constructor por parámetros
@param[in] tam El tamaño del vector dinámico de unsigned int que vamos a crear
*/
		VD_unsignedint(int tam);
/**
@brief Constructor de copia
*/
		VD_unsignedint(const VD_unsignedint &V);
/**
@brief Destructor
*/
		~VD_unsignedint();
/**
@brief Operador de asignación
@return Un vector dinámico de unsigned int  en el que se realiza la asignación
*/
		VD_unsignedint &operator=(const VD_unsignedint &V);
/**
@brief Consultar el numero de elementos del vector dinámico de unsigned int
@return Un valor entero que indica el numero de elementos.
*/
		int Size()const;
/**
@brief Añadir un valor entero al vector dinámico unsigned int
@param[in] i El valor unsigned int que queremos añadir al vector
*/
		void Add(unsigned int i);
/**
@brief Consultar el valor al que pertenece una posición en el vector dinamico de unsigned int
@param[in] i Un valor entero que representa la posición que queremos consultar
@return El valor unsigned int en el vector dinamico de unsigned int que tiene la posición indicada
*/
		unsigned int Get(int i)const;
/**
@brief Modificar el valor del unsigned int que pertenece a una posición en el vector dinamico de unsigned int
@param[in] i El valor entero que indica la posición que queremos modificar
@param[in] v El valor unsigned int que queremos asignar a esa posición
*/
		void Set(int i, unsigned int v);
/**
@brief Borrar el elemento del vector dinamico de unsigned int que hay en una posición indicada
@param[in] pos Un entero que representa la posición del elemento que queremos eliminar
*/
		void Borrar(int pos);
/**
@brief Sobrecarga del operador de igualdad
@return True si son iguales, False si no son iguales
*/
		bool operator==(VD_unsignedint &vd);
/**
@brief Sobrecarga del operador de desigualdad
@return False si son iguales, True si no son iguales
*/
		bool operator!=(VD_unsignedint &vd);
/** 
@brief Añade un elemento al final de un vector dinamico de unsigned int
@param[in] a Un valor unsigned int que es el elemento que queremos añadir 
*/
		VD_unsignedint operator+(unsigned int a);
/** 
@brief Concatena un vector dinamico de unsigned int al final del vector dinamico de unsigned int que tenemos
*/
		VD_unsignedint operator+(VD_unsignedint &v);
/** 
@brief Sobrecarga del operador de consulta [] de una posición del vector dinamico de unsigned int
@param[in] i Un valor entero que representa la posicion que vamos a consultar
@return El valor unsigned int del elemento que se quiere consultar
*/
		unsigned int &operator[](int i);
/** 
@brief Añade un elemento al final de un vector dinamico de unsigned int
@param[in] a Un valor unsigned int que indica el elemento que queremos añadir 
@param[in] vd El vector dinamico de unsigned int al que queremos añadirle el elemento
*/		
		friend VD_unsignedint operator+(unsigned int a,const VD_unsignedint &vd);
/** 
@brief Sobrecarga del operador de salida
*/
		friend ostream & operator<<(ostream &os,const VD_unsignedint &vd);
/** 
@brief Sobrecarga del operador de entrada
*/
		friend istream & operator>>(istream &is, VD_unsignedint &vd);

};
#endif
